package db

import (
	"errors"
	"jtdevice/configs"
	"jtdevice/internal/timer"
	"jtdevice/pkg/orm"

	"gorm.io/driver/mysql"
)

type Options struct {
	Name    string `json:"name"`
	Address string `json:"address"`
}

func Run() (err error) {
	var o Options
	if err := configs.GViper.UnmarshalKey("sql", &o); err != nil {
		return err
	}
	err = errors.New("invalid database")
	switch o.Name {
	case "mysql":
		err = orm.CreateDB(mysql.New(mysql.Config{
			DSN: o.Address,
			// DefaultStringSize:         64,    // string 类型字段的默认长度
			DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
			DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
			DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
			SkipInitializeWithVersion: false, // 根据版本自动配置
		}), false)
	}
	if err != nil {
		return err
	}
	timer.DbPart.Run()
	Dispatcher().Run()
	return nil
}

func Shutdown() {
	timer.DbPart.Release()
	Dispatcher().Stop()
}
